package com.boil.qz.safekavass.web.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.boil.util.Constants;

/**
 * Created by ChenYong on 2017-04-14.
 * <br>
 * <p>
 * 初始化拦截器。
 */
public class InitInterceptor extends HandlerInterceptorAdapter {
    /**
     * 日志
     */
    private static Logger log = LoggerFactory.getLogger(InitInterceptor.class);

    /**
     * 在处理请求之前被调用。
     * <ol>
     * <li>返回 true，表示继续执行下一个拦截器；</li>
     * <li>返回 false，表示中断流程，不继续执行后面的拦截器。</li>
     * </ol>
     *
     * @param request  请求
     * @param response 响应
     * @param handler  处理实例
     */
    @Override
    public boolean preHandle(HttpServletRequest request, //
                             HttpServletResponse response, //
                             Object handler) throws Exception {
        // 当第一个请求来时，立刻缓存服务器的请求路径
        if (Constants.SERVER_REQUEST_PATH == null) {
            Constants.SERVER_REQUEST_PATH = String.format("%s://%s:%s%s/", //
                    request.getScheme(), //
                    request.getServerName(), //
                    request.getServerPort(), //
                    request.getContextPath());

            log.info("服务器请求路径：{}", Constants.SERVER_REQUEST_PATH);
        }

        return true;
    }

    /**
     * 后处理回调方法，实现处理器的后处理（但在渲染视图之前），此时我们可以通过 modelAndView（模型和视图对象）
     * 对模型数据进行处理或对视图进行处理，modelAndView 也可能为 null。
     *
     * @param request      请求
     * @param response     响应
     * @param handler      处理实例
     * @param modelAndView 模型视图
     */
    @Override
    public void postHandle(HttpServletRequest request, //
                           HttpServletResponse response, //
                           Object handler, //
                           ModelAndView modelAndView) throws Exception {
        super.postHandle(request, response, handler, modelAndView);
    }

    /**
     * 整个请求处理完毕回调方法，即在视图渲染完毕时回调，如性能监控中我们可以在此记录结束时间并输出消耗时间，
     * 还可以进行一些资源清理，类似于 try-catch-finally 中的finally，
     * 但仅调用处理器执行链中 preHandle 返回 true 的拦截器的 afterCompletion。
     *
     * @param request  请求
     * @param response 响应
     * @param handler  处理实例
     * @param ex       异常
     */
    @Override
    public void afterCompletion(HttpServletRequest request, //
                                HttpServletResponse response, //
                                Object handler, //
                                Exception ex) throws Exception {
        super.afterCompletion(request, response, handler, ex);
    }
}